package com.mipo.client.javase.j2se.reg;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class Main {
	
	public static void main(String[] args) {
		MatchChinese();//匹配中文
	}
	
	
	
	public static void MatchChinese(){
		Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
		Matcher matcher = pattern.matcher("匹配中文字符的正则表1a达式");
		System.out.println(matcher.find());
	}
	
	
	
	/**
	 * 8-20位字母、数字、特殊符号(!#*_)的两种
	 * 不含3个连续（正/逆）或重复的数字
	 * 不能是用户名
	 */
	@Test
	public void reg1(){
		//String sss = "a321111123111_a";
		String sss = "wgnt001";
		/*
?! 属于零宽断言的正向否定断言,表示后面的字符组合在字符串中不存在
^ 表示字符串的开头
$ 表示字符串的结尾
[0-9] 表示0到9的数字字符
[0-9]+ 表示由0到9数字字符组成的字符串,[A-Z]+和[a-z]+以此类推
(?!^[0-9]+$)表示字符串不能是全数字的字符串
(?!^[A-Z]+$)表示字符串不能是全大写英文字母的字符串
(?!^[a-z]+$)表示字符串不能是全小写英文字母的字符串
^在中括号里面表示取反的意思
[^A-z0-9]+ 表示除英文大小写字母和数字外的字符组合
(?!^[^A-z0-9]+$)表示字符串不能是除英文大小写字母和数字外的字符串
^.{6,20}$ 表示由任意字符组成的6到20位的字符串
(?!^[0-9]+$)(?!^[A-Z]+$)(?!^[a-z]+$)(?!^[^A-z0-9]+$)^.{6,20}$ 表示由大小写英文字母和数字混合组成的6到20个字符的字符串
		 * */
		Pattern p = Pattern.compile("^(?![0-9]+$)(?![A-Z]+$)(?![!#*_]+$)(?![a-z]+$)[a-zA-Z0-9!#*_]{8,20}$");
		Matcher m = p.matcher(sss);
		boolean b = m.matches();
		System.out.println(b);
		
		
		Pattern p2 = Pattern.compile("([0-9])\\1+\\1+");
		Matcher m2 = p2.matcher(sss);
		boolean b2 = m2.find();
		System.out.println(b2);
		
		Pattern p3 = Pattern.compile("(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}[0-9]");
		Matcher m3 = p3.matcher(sss);
		boolean b3 = m3.find();
		System.out.println(b3);
		
		Pattern p4 = Pattern.compile("(9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2}[0-9]");
		Matcher m4 = p4.matcher(sss);
		boolean b4 = m4.find();
		System.out.println(b4);
		
		
		
		
		
		
		
		
		
	}
	
	/**
	 * 测试^符号
	 */
	@Test
	public void reg2(){
		String input = "@kevin@163.net";
		Pattern p1 = Pattern.compile("^\\."); // 在字符串开头找是否有.这个字符号(即第一个字符是否为.)
		Pattern p2 = Pattern.compile("\\.");  // 在字符串所有地方找是否有.这个字符号
		Matcher m1 = p1.matcher(input);
		Matcher m2 = p2.matcher(input);
		boolean b1 = m1.matches();
		boolean b2 = m2.matches();
		System.out.println("b1:"+b1); //false
		System.out.println("b2:"+b2); //false
		if (m1.find()) {
			System.out.println("匹配1");
		} else {
			System.out.println("没匹配2"); // 打印:没匹配2s
		}
		if (m2.find()) {
			System.out.println("匹配3"); // 打印:匹配3
		} else {
			System.out.println("没匹配4");
		}
	}
	
	/**
	 * 测试$符号
	 */
	@Test
	public void reg3(){
		boolean a1 = "hello sir".matches(".*ir$"); // $为限制结尾
		boolean a2 = "hello si2r".matches(".*ir$"); // $为限制结尾
		boolean a3 = "x@".matches(".*ir$"); // $为限制结尾
		System.out.println(a1); // true
		System.out.println(a2); // false
		System.out.println(a3); // false
	}
	@Test
	public void reg4(){
		String sss = "123456789";
		Pattern p = Pattern.compile("[a-zA-Z0-9!#*_]{8,20}$");
		Matcher m = p.matcher(sss);
		boolean b = m.matches();
		System.out.println(b);
	}
	@Test
	public void reg5(){
		String sss = "123456789";
		Pattern p = Pattern.compile("[0-9]+");
		Matcher m = p.matcher(sss);
		boolean b = m.matches();
		System.out.println(b);
	}
	
	/**
	 * 贪婪和非贪婪模式
	 */
	@Test
	public void reg6(){
		String sss = "A|A．有限：除银行活期账户和定期存款外，我基本没有其他投资经验;B|B．一般：除银行活期账户和定期存款外，我购买过基金、保险等理财产品，但还需要进一步的指导;C|C．丰富：我是一位有经验的投资者，参与过股票、基金等产品的交易，并倾向于自己做出投资决策;D|D．非常丰富：我是一位非常有经验的投资者，参与过权证、期货或创业板等高风险产品的交易";
		String reg = "(?<=B．).{0,100}(?=;)";
		Pattern pattern = Pattern.compile(reg);
		Matcher matcher = pattern.matcher(sss);
		while (matcher.find()) {
			System.out.println(matcher.group()); // 输出：一般：除银行活期账户和定期存款外，我购买过基金、保险等理财产品，但还需要进一步的指导;C|C．丰富：我是一位有经验的投资者，参与过股票、基金等产品的交易，并倾向于自己做出投资决策
		}
		String reg2 = "(?<=B．).{0,100}?(?=;)";
		Pattern pattern2 = Pattern.compile(reg2);
		Matcher matcher2 = pattern2.matcher(sss);
		while (matcher2.find()) {
			System.out.println(matcher2.group()); // 输出：一般：除银行活期账户和定期存款外，我购买过基金、保险等理财产品，但还需要进一步的指导
		}
	}
	@Test
	public void reg7(){
		String sss1 = "01203456";
		Pattern p1 = Pattern.compile("([0-9]+$)");
		Matcher m1 = p1.matcher(sss1);
		boolean b1 = m1.matches();
		System.out.println(b1);
		
		String sss2 = "abcff";
		Pattern p2 = Pattern.compile("([a-z]+$)");
		Matcher m2 = p2.matcher(sss2);
		boolean b2 = m2.matches();
		System.out.println(b2);
		
		String sss3 = "ba%%%%%%%%%";
		Pattern p3 = Pattern.compile("ba[%_]{8,20}$");
		Matcher m3 = p3.matcher(sss3);
		boolean b3 = m3.matches();
		System.out.println(b3);
		
		
		
		
		
		String sss = "123456aaa%%%%";
		Pattern p = Pattern.compile("^([0-9]+$)([a-z]+$)[%_]{8,20}$");
		Matcher m = p.matcher(sss);
		boolean b = m.matches();
		System.out.println(b);
	}
	
}
